#!/bin/sh
_=[[
	: ${LUA:=$(command -v lua-5.2)}
	: ${LUA:=$(command -v lua5.2)}
	: ${LUA:=$(command -v lua-52)}
	: ${LUA:=$(command -v lua52)}
	: ${LUA:=$(command -v luajit)}
	: ${LUA:=$(command -v lua)}

	exec ${LUA} "$0" "$@"
]]

local des = require"openssl.des"
local cipher = require"openssl.cipher"
local bit32 = require"bit32"

local function lm_encrypt(key)
	return cipher.new"DES-ECB":encrypt(key, nil, false):final"KGS!@#$%"
end -- lm_encrypt

local lshift = bit32.lshift
local band = bit32.band
local rshift = bit32.rshift
local bor = bit32.bor

local function lm_string_to_key(s)
	local s0, s1, s2, s3, s4, s5, s6 = string.byte(s, 1, 7)
	local k0, k1, k2, k3, k4, k5, k6, k7

	s0 = s0 or 0
	s1 = s1 or 0
	s2 = s2 or 0
	s3 = s3 or 0
	s4 = s4 or 0
	s5 = s5 or 0
	s6 = s6 or 0

	k0 = s0
	k1 = bor(band(lshift(s0, 7), 255), rshift(s1, 1))
	k2 = bor(band(lshift(s1, 6), 255), rshift(s2, 2))
	k3 = bor(band(lshift(s2, 5), 255), rshift(s3, 3))
	k4 = bor(band(lshift(s3, 4), 255), rshift(s4, 4))
	k5 = bor(band(lshift(s4, 3), 255), rshift(s5, 5))
	k6 = bor(band(lshift(s5, 2), 255), rshift(s6, 6))
	k7 = band(lshift(s6, 1), 255)

	return des.set_odd_parity(string.char(k0, k1, k2, k3, k4, k5, k6, k7))
end -- lm_string_to_key

local function lm_hash(pass)
	pass = string.upper(pass)

	if #pass < 14 then
		pass = pass .. string.rep(string.char(0), 14 - #pass)
	end

	local key1 = lm_string_to_key(string.sub(pass, 1, 7))
	local key2 = lm_string_to_key(string.sub(pass, 8, 14))

	return lm_encrypt(key1) .. lm_encrypt(key2)
end -- lm_hash

local function tohex(s)
	return (string.gsub(s, ".", function (c)
		return string.format("%.2x", string.byte(c))
	end))
end -- tohex

local pass = ... or "passphrase"

print(pass, tohex(lm_hash(pass)))
